package ru.niir.goodfil.utils.validation;

/**
 * Информация об ошибочном заполнении поля
 */
public class ValidationError
{
    /**
     * Выявленная проблема
     */
    private final ValidationProblem problem;

    /**
     * Наименование поля
     */
    private final String fieldName;

    /**
     * Проблемное значение
     */
    private final String fieldValue;

    /**
     * Комментарий
     */
    private final String comment;

    private final String fieldHimanName;

    /**
     * Конструктор
     * @param problem выявленная проблема
     * @param fieldName наименование поля
     * @param fieldValue проблемное значение
     */
    public ValidationError(String fieldName, String fieldHumanName, Object fieldValue, ValidationProblem problem)
    {
        this.problem = problem;
        this.fieldName = fieldName;
        this.fieldHimanName = fieldHumanName;
        this.fieldValue = String.valueOf(fieldValue);
        this.comment = "";
    }

    /**
     * Конструктор
     * @param problem выявленная проблема
     * @param fieldName наименование поля
     * @param fieldValue проблемное значение
     * @param comment Комментарий
     */
    public ValidationError(String fieldName, String fieldHumanName, Object fieldValue, ValidationProblem problem, String comment)
    {
        this.problem = problem;
        this.fieldName = fieldName;
        this.fieldHimanName = fieldHumanName;
        this.fieldValue = String.valueOf(fieldValue);
        this.comment = comment;
    }

    /**
     * Выявленная проблема
     */
    public ValidationProblem getProblem()
    {
        return problem;
    }

    /**
     * Наименование поля
     */
    public String getFieldName()
    {
        return fieldName;
    }

    /**
     * Проблемное значение
     */
    public String getFieldValue()
    {
        return fieldValue;
    }

    /**
     * Комментарий
     */
    public String getComment()
    {
        return comment;
    }

    @Override
    public String toString()
    {
        return "ValidationError{" +
               "problem=" + problem +
               ", fieldName='" + fieldName + '\'' +
               ", fieldValue='" + fieldValue + '\'' +
               ", comment='" + comment + '\'' +
               '}';
    }

    public String toHumanString()
    {
        switch (problem)
        {
            case NOT_EMPTY: return "Значение поля " + fieldHimanName + " не должно быть пусто";
            case NOT_NULL: return "Значение поля " + fieldHimanName + " не должно равняться null";
            case POSITIVE: return "Значение поля " + fieldHimanName + " должно быть больше нуля";
            case POSITIVE_ZERO: return "Значение поля " + fieldHimanName + " должно быть неотрицательно";
            case REFERENCE: return "Значение поля " + fieldHimanName + " задано неверно";
            case UNIQUE: return "Значение поля " + fieldHimanName + " не уникально";
            case CUSTOM: return comment;
        }
        return "";
    }
}
